# test02_mysql_redis.py
# mysql和redis数据同步
# 读取数据：先到redis中查询数据，如果不存在会到mysql中查询数据，mysql查询到数据后返回的同时，会将数据再存储一份到redis中；下一次再查询就会从redis中查询数据。
# 删除/更新数据：先将mysql中的数据删除/更新，同时删除redis中的数据。
# 数据同步类
import pymysql, redis
class DataSync:
    def __init__(self):
        # 创建mysql连接对象，保存到当前对象的属性
        try:
            self.conn = pymysql.connect(
                host='192.168.88.100',
                port=3306,
                user='root',
                password='123456',
                db='tedu_test',
                charset='utf8'
            )
            self.cur = self.conn.cursor()
        except Exception as e:
            print('mysql连接失败：', e)
            exit(1)  # 退出进程
        # 创建redis数据库的连接
        try:
            self.r = redis.Redis(host='192.168.88.100', port=6379, db=0)
        except Exception as e:
            print('redis连接失败：', e)
            exit(1)

    # 查询数据
    def get_data(self, id):
        # 设置存储在redis的名称
        redis_name = f'student_{id}'
        # 首先会到redis中查询
        redis_result = self.r.hgetall(redis_name)
        # print(redis_result)
        # 判断是否查询到数据
        if len(redis_result) > 0:
            # 将字节串转为了字符串
            # 在return的同时会阻止往后执行
            print('redis返回')
            # 如果仍然后请求访问该数据，就重新设置过期时间
            self.r.expire(redis_name, 600)
            return get_dict(redis_result)

        # 到mysql中查询出id对应的数据
        sql = 'select * from tedu_student where stu_id=%s'
        self.cur.execute(sql, (id,))
        result = self.cur.fetchone()
        # (1001, 'zs', datetime.date(1990, 12, 15), '13344445555')
        # 将数据转为字典类型
        stu_dict = {
            'stu_id': result[0],
            'stu_name': result[1],
            'stu_birth': str(result[2]),
            'stu_phone': result[3]
        }
        # 将数据同步一份到redis 存储的名词'student_xxxx'
        for key, value in stu_dict.items():
            self.r.hset(redis_name, key, value)
        # 设置过期时间
        self.r.expire(redis_name, 600)
        # 返回这条数据
        print('mysql返回')
        return stu_dict
    # 删除数据
    def delete_data(self, id):
        sql = 'delete from tedu_student where stu_id=%s'
        self.cur.execute(sql, (id,))
        # 提交事务
        self.conn.commit()
        # 删除redis数据
        redis_name = f'student_{id}'
        self.r.delete(redis_name)
    # 修改数据，传递id，stu_phone

def get_dict(dict01):
    dict02 = {}
    # 遍历传递进来的字典，将键值都转换为字符串
    for key, value in dict01.items():
        key = str(key, encoding='utf-8')
        value = str(value, encoding='utf-8')
        # 放到新字典
        dict02[key] = value
    return dict02
if __name__ == '__main__':
    d = DataSync()
    # print(d.get_data(1001))
    # print(d.get_data(1003))
    d.delete_data(1003)

